package cn.doitedu.df_rdd

import cn.doitedu.beans.Student
import cn.doitedu.util.SparkUtil
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.types.StructType

/**
 * @Date 22.4.12
 * @Created by HANGGE
 * @Description
 *             将数据封装在case class中  转换成DF
 */
object C04_RDD_2_DF_Tuple {
  def main(args: Array[String]): Unit = {
    val session = SparkUtil.getSession
    //获取sparkContext
    val sc = session.sparkContext
    // 加载数据  RDD
    val rdd: RDD[String] = sc.textFile("data\\scores\\Scores.csv")

    // RDD的数据结构 封装case  class
    val tupleRDD = rdd.map(line => {
      val arr = line.split(",")
      (arr(0).toInt, arr(1), arr(2).toInt, arr(3), arr(4), arr(5).toDouble)
    })

    // 创建DataFrame
    val df = session.createDataFrame(tupleRDD)
    // 创建DataFrame
    import  session.implicits._
    // 转换DF的时候 添加字段名
    val df2 = tupleRDD.toDF("id" , "name" , "age" , "gender" , "city" , "score")

    /**
     * root
     * |-- _1: integer (nullable = false)
     * |-- _2: string (nullable = true)
     * |-- _3: integer (nullable = false)
     * |-- _4: string (nullable = true)
     * |-- _5: string (nullable = true)
     * |-- _6: double (nullable = false)
     *
     * 可以直接将Tuple转换成DataFrame
     *   1) 可以自动的识别各个字段的数据类型
     *   2) ***  属性信息以索引的方式命名     | _1|  _2| _3| _4|  _5|  _6|
     *   3) toDF(字段名)  可以结构添加指定的字段名
     */

    df.printSchema()
    df2.printSchema()


    df.show()
    df2.show()

  }

}
